package com.youlv.yl.service.impl;

import com.youlv.yl.config.RedisKeyConfig;
import com.youlv.yl.config.UserScoreConfig;
import com.youlv.yl.entity.user.UserSign;
import com.youlv.yl.dao.UserSignDao;
import com.youlv.yl.service.intf.UserLevelService;
import com.youlv.yl.service.intf.UserSignService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlv.yl.util.DateUtils;
import com.youlv.yl.util.JedisUtils;
import com.youlv.yl.util.StringUtils;
import com.youlv.yl.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Random;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author fenghe
 * @since 2022-01-12
 */
@Service
public class UserSignServiceImpl extends ServiceImpl<UserSignDao, UserSign> implements UserSignService {
    @Autowired
    private UserSignDao dao;
    @Autowired
    private UserLevelService levelService;

    /** 校验今日是否可以签到*/
    @Override
    public R checkSign(String token) {
        if (StringUtils.isNotEmpty(token)) {
            // 查看当天，当前用户有没有签到记录
            // 查询最后一次的签到记录
            UserSign userSign = querySign(token);
            if (userSign == null) {
                // 没有签过到，允许首次签到
                return R.ok();
            } else {
                // 2.需要校验，今天是否签过到
                if (DateUtils.dateEq(userSign.getCtime(), new Date())) {
                    // 时间相同，今日已签到
                    return R.fail("亲，您今日已签到，请明日再来！");
                } else {
                    // 今日未签到，允许签到
                    return R.ok();
                }
            }
        }
        return R.fail("亲，请先登录哦！");
    }


    /** 实现签到*/
    /**开启事务*/
    @Transactional
    @Override
    public R addSign(String token) {
        // 入参校验
        if(StringUtils.isNotEmpty(token)) {
            // 1.获取uid 通过令牌获取uid
            Long uid = Long.parseLong(JedisUtils.getString(RedisKeyConfig.USER_TOKEN + token));
            // 2.查询最后一次的签到记录
            UserSign sign = dao.selectLast(uid);
            UserSign userSign = new UserSign();
            userSign.setUid(uid);
            userSign.setCtime(new Date());
            // 随机生成基础奖励
            userSign.setScore(new Random().nextInt(3) + 1);
            // 3.验证是否为首次签到
            if(sign == null) {
                // 首次签到
                userSign.setDays(UserScoreConfig.LOGIN_SCORE);
                userSign.setExtscore(UserScoreConfig.SIGN_SCORE_F);
                dao.insert(userSign);
                levelService.save(uid, userSign.getScore() + userSign.getExtscore(), "首次签到的奖励");
            } else {
                // 验证是否为连续签到，最后一次签到日期是否为昨天
                if(DateUtils.dateEq(sign.getCtime(), DateUtils.getDateByDay(-1))) {
                    // 昨天已签到
                    int days = sign.getDays() + 1;
                    userSign.setDays(days);
                    // 验证连续签到的天数，给予额外的奖励
                    if(days % UserScoreConfig.SIGN_DAY_365 == 0) {
                        // 连续签到一年
                        userSign.setExtscore(UserScoreConfig.SIGN_SCORE_Y);
                    } else if(days % UserScoreConfig.SIGN_DAY_30 == 0) {
                        // 连续签到30天
                        userSign.setExtscore(UserScoreConfig.SIGN_SCORE_M);
                    } else if(days % UserScoreConfig.SIGN_DAY_7 == 0) {
                        // 连续签到7天
                        userSign.setExtscore(UserScoreConfig.SIGN_SCORE_M);
                    } else if(days % UserScoreConfig.SIGN_DAY_3 == 0) {
                        // 连续签到3天
                        userSign.setExtscore(userSign.getScore());
                    }
                } else {
                    // 不是连续签到
                    userSign.setDays(UserScoreConfig.LOGIN_SCORE);
                }
                // 新增签到记录
                dao.insert(userSign);
                // 积分变动，需要校验等级是否发生改变
                if(userSign.getExtscore() == null) {
                    userSign.setExtscore(0);
                }
                levelService.save(uid, userSign.getScore() + userSign.getExtscore(), "签到的奖励");
            }
            return R.ok();
        } else {
            return R.fail("请先登陆哦");
        }
    }

    /** 实现签到查询 通过token查询uid用户信息*/
    @Override
    public UserSign querySign(String token) {
        if(StringUtils.isNotEmpty(token)) {
            // 通过令牌获取uid
            Long uid = Long.parseLong(JedisUtils.getString(RedisKeyConfig.USER_TOKEN + token));
            // 查询当前用户最后一次的签到记录
            return dao.selectLast(uid);
        }
        return null;
    }
}
